
let arr = [];
//创建随机数组
//number/string等 基本数据类型 可以被set去重
for(let i = 0; i < 100000;i ++) {
  arr.push(Math.floor(100000* Math.random()))
}

//json对象不可被set去重
// arr = [
//   {"name": "lucy"},
//   {"name": "alice"},
//   {"name": "mok"},
//   {"name": "jack"},
//   {"name": "lucy"},
// ]
//因为：即便是2个空对象，都会被判定为不相等
//这是 引用数据类型 和基本数据类型的区别
// console.log({}==={})//false

console.log('初始化的数组：', arr)

// 【1】用set去重
let setFn = function (arr){
  //计算去重花费的时间
  console.time('setFn')

  //set是es6提供的对象，它的构造函数可以接受一个数组
  //set对象中的内容，始终是不会重复的。利用这一点，即使传入了重复的数组，set自动会去重
  // let s = new Set(arr)
  //实例化的set对象 是一个序列化的对象
  // console.log('实例化后的set序列化对象：', s)

  //Array.from方法，可以将一个 类数组对象 转换为 数组
  //类数组对象: {0:"xxx", 1: "123", 2: "hello"}

  //不去声明 let s = new Set(arr)，这里直接用new Set，速度快10倍
  let arr2 = Array.from(new Set(arr))
  // console.log("去重之后的数组：", arr2)

  console.timeEnd('setFn')
}

//【2】map去重
let mapFn = function (arr){
  //计算去重花费的时间
  console.time('mapFn')

  let arr2 = []
  let tempMap = new Map()
  //遍历数组
  for(let i=0; i<arr.length; i++){
    //在map对象中 找key 为 arr[i]，是否有值
    if(!tempMap.get(arr[i])){
      //找不到，则不重复，push进新数组
      arr2.push(arr[i])
      //将map的key 设置为 arr[i]，值随便设置。
      tempMap.set(arr[i], 1)
    }
  }
  // console.log('去重后的数组：', arr2)
  console.timeEnd('mapFn')
}

//【3】sort排序 reduce去重
let sortFn = function(arr){
  //计算去重花费的时间
  console.time('sortFn')
  
  //sort排序,reduce遍历 去重
  //reduce((上一次遍历retren的结果, 数组中当前被遍历的数据)=>{}, 首次遍历pre的值)
  arr.sort().reduce((pre, cur)=>{
    if( (pre.length === 0) || (pre[pre.length-1] != cur) ){
      //需要push的情况
      //pre的长度为0（首次遍历）
      //pre[length-1]，pre的末尾 不等于 当前cur
      pre.push(cur)
    }
    return pre
  }, [])
  // console.log('去重后的数组：', arr)
  console.timeEnd('sortFn')
}

// 【结论，set > map > sort+reduce】
mapFn(arr)
setFn(arr)
sortFn(arr)